package net.xumf.support.common;

import net.xumf.support.model.dto.PageDTO;
import net.xumf.support.model.vo.PageVO;

import java.util.Optional;

/**
 * 业务基本方法
 *
 * @param <P>  pojo
 * @param <ID> 主键的类型
 */
public interface BaseService<P, ID> {

    /**
     * 通过id获取
     *
     * @param id id
     * @return pojo对象
     */
    Optional<P> getById(ID id);

    /**
     * 查找所有
     *
     * @return {@link P} pojo列表
     */
    Iterable<P> getAll();

    /**
     * 分页查找
     *
     * @param pageDTO {@link PageDTO}
     * @return {@link PageVO}
     */
    <T extends PageDTO> PageVO getByPage(T pageDTO);

    /**
     * 更新模块
     *
     * @param pojo {@link S}
     */
    <S extends P> void update(S pojo);

    /**
     * 添加模块
     *
     * @param pojo {@link S}
     */
    <S extends P> P add(S pojo);

    /**
     * 删除模块
     *
     * @param pojoId {@link ID} 模型的id
     */
    void remove(ID pojoId);

    /**
     * 删除所有模块
     *
     */
    void removeAll();

    /**
     * 动态更新数据，不更新的数据为null
     *
     * @param s P的子类
     */
    <S extends P> P dynamicSave(S s);
}
